/**
 * 通知管理服务
 * 用于全局管理通知消息的显示和隐藏
 */

import { reactive, App } from 'vue'
import NotificationToast from '../components/NotificationToast.vue'
import type { NotificationType, NotificationConfig } from '../types'

/**
 * 通知服务
 */

// 重新导出类型以保持向后兼容
export type { NotificationType, NotificationConfig }

// 通知项接口
interface NotificationItem extends NotificationConfig {
  id: string
  component?: any
}

// 通知状态
const notificationState = reactive({
  notifications: [] as NotificationItem[]
})

// 通知ID计数器
let notificationId = 0

/**
 * 生成唯一的通知ID
 * @returns 通知ID
 */
function generateId(): string {
  return `notification_${++notificationId}_${Date.now()}`
}

/**
 * 显示通知
 * @param config 通知配置
 * @returns 通知ID
 */
export function showNotification(config: NotificationConfig): string {
  const id = generateId()
  const notification: NotificationItem = {
    id,
    type: 'info',
    duration: 2500, // 默认2.5秒自动关闭
    closable: true,
    ...config
  }
  
  notificationState.notifications.push(notification)
  
  // 如果设置了自动关闭时间，则自动移除
  if (notification.duration && notification.duration > 0) {
    setTimeout(() => {
      removeNotification(id)
    }, notification.duration)
  }
  
  return id
}

/**
 * 移除通知
 * @param id 通知ID
 */
export function removeNotification(id: string): void {
  const index = notificationState.notifications.findIndex(n => n.id === id)
  if (index > -1) {
    notificationState.notifications.splice(index, 1)
  }
}

/**
 * 清除所有通知
 */
export function clearAllNotifications(): void {
  notificationState.notifications.length = 0
}

/**
 * 显示成功通知
 * @param message 消息内容
 * @param title 标题（可选）
 * @param duration 持续时间（可选，默认3秒）
 * @returns 通知ID
 */
export function showSuccess(message: string, title?: string, duration: number = 3000): string {
  return showNotification({
    type: 'success',
    title,
    message,
    duration
  })
}

/**
 * 显示错误通知
 * @param message 消息内容
 * @param title 标题（可选）
 * @param duration 持续时间（可选，默认3秒）
 * @returns 通知ID
 */
export function showError(message: string, title?: string, duration: number = 3000): string {
  return showNotification({
    type: 'error',
    title: title || '错误',
    message,
    duration
  })
}

/**
 * 显示警告通知
 * @param message 消息内容
 * @param title 标题（可选）
 * @param duration 持续时间（可选，默认3秒）
 * @returns 通知ID
 */
export function showWarning(message: string, title?: string, duration: number = 3000): string {
  return showNotification({
    type: 'warning',
    title: title || '警告',
    message,
    duration
  })
}

/**
 * 显示信息通知
 * @param message 消息内容
 * @param title 标题（可选）
 * @param duration 持续时间（可选，默认2秒）
 * @returns 通知ID
 */
export function showInfo(message: string, title?: string, duration: number = 2000): string {
  return showNotification({
    type: 'info',
    title,
    message,
    duration
  })
}

/**
 * 获取通知状态（用于组件绑定）
 * @returns 通知状态
 */
export function getNotificationState() {
  return notificationState
}

/**
 * Vue插件安装函数
 * @param app Vue应用实例
 */
export function install(app: App): void {
  // 注册全局组件
  app.component('NotificationToast', NotificationToast)
  
  // 注册全局属性
  app.config.globalProperties.$notify = {
    show: showNotification,
    success: showSuccess,
    error: showError,
    warning: showWarning,
    info: showInfo,
    remove: removeNotification,
    clear: clearAllNotifications
  }
}

// 默认导出
export default {
  install,
  showNotification,
  showSuccess,
  showError,
  showWarning,
  showInfo,
  removeNotification,
  clearAllNotifications,
  getNotificationState
}